/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package py.gestionpymes.utils.web;

import py.gestionpymes.utils.servicios.AbstractDAO;
import java.io.Serializable;
import java.util.List;
import javax.faces.model.SelectItem;

/**
 *
 * @author christian
 */
public abstract class BeanGenerico<T> implements Serializable {

    private T actual;

    public T getActual() {
        if (actual == null) {
            actual = getNuevo();
        }
        return actual;
    }

    public void setActual(T actual) {
        this.actual = actual;
    }

    public abstract AbstractDAO<T> getEjb();

    public abstract T getNuevo();

    public String create() {
        if (getEjb().create(getActual()) != null) {
            JsfUtil.addSuccessMessage("Se creó exitosamente!");
            setActual(null);
            return "listado.xhtml";
        } else {
            return null;
        }

    }

    public String edit() {
        if (getEjb().edit(getActual()) == null) {
            JsfUtil.addErrorMessage("Otro usuario realizó una modificación sobre el mismo dato,y pruebe de nuevo");
            return null;
        }
        
        JsfUtil.addSuccessMessage("Se guardó exitosamente!");
        setActual(null);
        return "listado.xhtml";
    }

    public String remove() {
        getEjb().remove(getActual());
        setActual(null);
        JsfUtil.addSuccessMessage("Se removió exitosamente!");
        return "listado.xhtml";
    }

    public T find(Object id) {
        return (T) getEjb().find(id);
    }

    public List<T> findAll() {
        return getEjb().findAll();
    }

    public SelectItem[] getItemsAvailableSelectMany() {
        return JsfUtil.getSelectItems(findAll(), false);
    }

    public SelectItem[] getItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems(findAll(), true);
    }

    public String preparaEdicion(T obj) {
        setActual(obj);
        return "edita.xhtml";
    }
}
